<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Module的严格模式</title>
</head>
<body>
    <h1>Module的严格模式</h1>
    <h2>ES6的模块自动采用严格模式</h2>

    <script type="module">
        // 变量必须声明后再使用
        // name = 'Tom'; // ReferenceError

        // 不能删除变量
        let x = 1;
        // delete x; // SyntaxError

        // 不能使用with语句
        // with (Math) {
        //     cos(2);
        // } // SyntaxError

        // 不能对只读属性赋值
        // Object.defineProperty({}, 'x', {
        //     value: 1,
        //     writable: false
        // }).x = 2; // TypeError

        // 不能使用八进制字面量
        // const n = 0o13; // SyntaxError

        // arguments对象是只读的
        function fn(a) {
            'use strict';
            // arguments[0] = 2; // TypeError
            console.log(a);
        }

        // this指向undefined
        console.log(this === undefined); // true

        // 不能使用caller和arguments
        function f() {
            // console.log(f.caller); // TypeError
            // console.log(f.arguments); // TypeError
        }

        // 示例：模块中的严格模式
        const obj = {
            get x() {
                return 17;
            }
        };
        // obj.x = 5; // TypeError: Cannot set property x which has only a getter

        function strictFunc() {
            console.log(this === undefined);
        }
        strictFunc(); // true
    </script>
</body>
</html> 